from rest_framework import serializers
from django_redis import get_redis_connection
from redis.exceptions import RedisError
import logging

logger = logging.getLogger('meiduo')


# 短信验证码序列化器
class RegisterSMSSerializer(serializers.Serializer):
    """
    校验验证码, image_code_id
    """
    text = serializers.CharField(label='用户输入的验证码',max_length=4,min_length=4,required=True)
    image_code_id = serializers.UUIDField(label='验证码唯一性id')

    # 需要对text image_code_id进行校验 多字段校验 validate
    def validate(self, attrs):
        """
        思路分析
        1.获取用户提交的验证码 uuid
        2.链接redis
        3.判断redis获取的验证码是否正确
        4.将redis中的验证码删除
        5.对redis的验证码编码之后进行对比,注意大小写
        6.返回
        """
        # 1.获取用户提交的验证码 uuid
        text = attrs['text']
        image_code_id = attrs['image_code_id']

        # 2.链接redis
        redis_conn = get_redis_connection('code')
        redis_text = redis_conn.get('img_%s'%image_code_id)

        # 3.判断redis获取的验证码是否存在
        if redis_text is None:
            raise serializers.ValidationError('验证码过期')

        # 4.将redis中的验证码删除
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except Exception as e:
            logging.error(e)

        # 5.对redis的验证码编码之后进行对比,注意大小写
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('验证码错误')

        # 6.返回
        return attrs
